<template>
  <div class="app-container">
    <div class="head-container">
      <a-form :model="queryParams" ref="queryRef" v-show="showSearch" layout="inline">
        <a-form-item prop="roleName">
          <a-input v-model="queryParams.roleName" :style="{ width: '150px' }" placeholder="请输入角色名称" clearable
            @keyup.enter="handleQuery" />
        </a-form-item>
        <a-form-item prop="status">
          <a-select v-model="queryParams.status" :style="{ width: '150px' }" placeholder="角色状态" clearable>
            <a-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label" :value="dict.value" />
          </a-select>
        </a-form-item>
        <a-form-item>
          <a-range-picker v-model="dateRange" :style="{ width: '300px' }" show-time value-format="YYYY-MM-DD HH:mm:ss"
            format="YYYY-MM-DD HH:mm:ss" />
        </a-form-item>
        <a-form-item>
          <a-space>
            <a-button type="primary" @click="handleQuery">
              <template #icon>
                <icon-search />
              </template>
              搜索
            </a-button>
            <a-button @click="resetQuery">
              <template #icon>
                <icon-refresh />
              </template>
              重置
            </a-button>
          </a-space>
        </a-form-item>
      </a-form>
    </div>
    <div class="main-container">
      <div class="main-toolbar">
        <a-space>
          <a-button type="primary" size="small" @click="showAddRole">新增</a-button>
          <a-button status="danger" size="small" :disabled="selectedKeys.length === 0"
            @click="handleDelete">删除</a-button>
        </a-space>
      </div>
      <div class="main-content">
        <a-table :columns="columns" :data="roleList" row-key="roleId"
          :row-selection="{ type: 'checkbox', showCheckedAll: true }" @selection-change="handleSelectionChange">
          <template #status="{ record }">
            <a-switch v-model="record.status" @change="handleStatusChange(record)" type="round" checked-value="0"
              unchecked-value="1">
              <template #checked>
                启用
              </template>
              <template #unchecked>
                停用
              </template>
            </a-switch>
          </template>
          <template #action="{ record }">
            <a-dropdown-button>
              操作
              <template #icon>
                <icon-settings />
              </template>
              <template #content>
                <a-doption @click="handleDataScope(record.roleId)">分配权限</a-doption>
                <a-doption @click="handleAuthUser(record.roleId)">分配用户</a-doption>
              </template>
            </a-dropdown-button>
          </template>
        </a-table>
      </div>
    </div>
    <RoleForm ref="roleForm"></RoleForm>
    <DataScopeForm ref="dataScopeForm"></DataScopeForm>
  </div>
</template>

<script setup>
import { treeselect as menuTreeselect, roleMenuTreeselect } from "@/api/system/menu";
import { addRole, changeRoleStatus, dataScope, delRole, deptTreeSelect, getRole, listRole, updateRole } from "@/api/system/role";
import { getCurrentInstance, nextTick, reactive, ref } from "vue";
import { useRouter } from "vue-router";
import DataScopeForm from "./dataScopeForm.vue";
import RoleForm from './roleForm';

const router = useRouter();
const { proxy } = getCurrentInstance();
const { sys_normal_disable } = proxy.useDict("sys_normal_disable");

const roleList = ref([]);
const open = ref(false);
const loading = ref(true);
const showSearch = ref(true);
const ids = ref([]);
const single = ref(true);
const multiple = ref(true);
const total = ref(0);
const title = ref("");
const dateRange = ref([]);
const menuOptions = ref([]);
const menuExpand = ref(false);
const menuNodeAll = ref(false);
const deptExpand = ref(true);
const deptNodeAll = ref(false);
const deptOptions = ref([]);
const openDataScope = ref(false);
const menuRef = ref(null);
const deptRef = ref(null);

/** 数据范围选项*/
const dataScopeOptions = ref([
  { value: "1", label: "全部数据权限" },
  { value: "2", label: "自定数据权限" },
  { value: "3", label: "本部门数据权限" },
  { value: "4", label: "本部门及以下数据权限" },
  { value: "5", label: "仅本人数据权限" }
]);

const data = reactive({
  form: {},
  queryParams: {
    pageNum: 1,
    pageSize: 10,
    roleName: undefined,
    roleKey: undefined,
    status: undefined
  },
  rules: {
    roleName: [{ required: true, message: "角色名称不能为空", trigger: "blur" }],
    roleKey: [{ required: true, message: "权限字符不能为空", trigger: "blur" }],
    roleSort: [{ required: true, message: "角色顺序不能为空", trigger: "blur" }]
  },
});

const { queryParams, form, rules } = toRefs(data);

const selectedKeys = ref([])
/** 查询角色列表 */
const columns = ref([
  { key: 0, title: `角色编号`, dataIndex: 'roleId' },
  { key: 1, title: `角色名称`, dataIndex: 'roleName', slotName: 'roleName' },
  { key: 2, title: `权限字符`, dataIndex: 'roleKey' },
  { key: 3, title: `显示顺序`, dataIndex: 'roleSort' },
  { key: 4, title: `状态`, dataIndex: 'status', slotName: 'status' },
  { key: 5, title: `创建时间`, dataIndex: 'createTime' },
  { key: 6, title: `操作`, slotName: 'action' }
]);

function getList() {
  loading.value = true;
  listRole(proxy.addDateRange(queryParams.value, dateRange.value)).then(({ data }) => {
    roleList.value = data.rows;
    total.value = data.total;
    loading.value = false;
  });
}
/** 搜索按钮操作 */
function handleQuery() {
  queryParams.value.pageNum = 1;
  getList();
}
/** 重置按钮操作 */
function resetQuery() {
  dateRange.value = [];
  proxy.resetForm("queryRef");
  handleQuery();
}
/** 删除按钮操作 */
function handleDelete(row) {
  const roleIds = row.roleId || ids.value;
  proxy.$modal.confirm('是否确认删除角色编号为"' + roleIds + '"的数据项?').then(function () {
    return delRole(roleIds);
  }).then(() => {
    getList();
    proxy.$modal.msgSuccess("删除成功");
  }).catch(() => { });
}
/** 导出按钮操作 */
function handleExport() {
  proxy.download("system/role/export", {
    ...queryParams.value,
  }, `role_${new Date().getTime()}.xlsx`);
}
/** 多选框选中数据 */
function handleSelectionChange(selection) {
  selectedKeys.value = selection
}
/** 角色状态修改 */
function handleStatusChange(row) {
  let text = row.status === "0" ? "启用" : "停用";
  proxy.$modal.confirm({
    title: '系统提示',
    content: `确认要${text}${row.roleName}角色吗?`,
    onOk: () => {
      changeRoleStatus(row.roleId, row.status).then(() => {
        proxy.$message.success(text + "成功");
      }).catch(() => {
        row.status = row.status === "0" ? "1" : "0";
      })
    },
    onCancel: () => {
      row.status = row.status === "0" ? "1" : "0";
    }
  })
}
/** 更多操作 */
function handleCommand(command, row) {
  switch (command) {
    case "handleDataScope":
      handleDataScope(row);
      break;
    case "handleAuthUser":
      handleAuthUser(row);
      break;
    default:
      break;
  }
}
/** 分配用户 */
function handleAuthUser(roleId) {
  router.push("/system/role-auth/user/" + roleId);
}
/** 查询菜单树结构 */
function getMenuTreeselect() {
  menuTreeselect().then(response => {
    menuOptions.value = response.data;
  });
}
/** 所有部门节点数据 */
function getDeptAllCheckedKeys() {
  // 目前被选中的部门节点
  let checkedKeys = deptRef.value.getCheckedKeys();
  // 半选中的部门节点
  let halfCheckedKeys = deptRef.value.getHalfCheckedKeys();
  checkedKeys.unshift.apply(checkedKeys, halfCheckedKeys);
  return checkedKeys;
}
/** 重置新增的表单以及其他数据 */
function reset() {
  if (menuRef.value != undefined) {
    menuRef.value.setCheckedKeys([]);
  }
  menuExpand.value = false;
  menuNodeAll.value = false;
  deptExpand.value = true;
  deptNodeAll.value = false;
  form.value = {
    roleId: undefined,
    roleName: undefined,
    roleKey: undefined,
    roleSort: 0,
    status: "0",
    menuIds: [],
    deptIds: [],
    menuCheckStrictly: true,
    deptCheckStrictly: true,
    remark: undefined
  };
  proxy.resetForm("roleRef");
}
function showAddRole() {
  proxy.$refs.roleForm.init('add')
}
/** 添加角色 */
function handleAdd() {
  reset();
  getMenuTreeselect();
  open.value = true;
  title.value = "添加角色";
}
/** 修改角色 */
function handleUpdate(row) {
  reset();
  const roleId = row.roleId || ids.value;
  const roleMenu = getRoleMenuTreeselect(roleId);
  getRole(roleId).then(response => {
    form.value = response.data;
    form.value.roleSort = Number(form.value.roleSort);
    open.value = true;
    nextTick(() => {
      roleMenu.then((res) => {
        let checkedKeys = res.checkedKeys;
        checkedKeys.forEach((v) => {
          nextTick(() => {
            menuRef.value.setChecked(v, true, false);
          });
        });
      });
    });
    title.value = "修改角色";
  });
}
/** 根据角色ID查询菜单树结构 */
function getRoleMenuTreeselect(roleId) {
  return roleMenuTreeselect(roleId).then(response => {
    menuOptions.value = response.menus;
    return response;
  });
}
/** 根据角色ID查询部门树结构 */
function getDeptTree(roleId) {
  return deptTreeSelect(roleId).then(response => {
    deptOptions.value = response.depts;
    return response;
  });
}
/** 树权限（展开/折叠）*/
function handleCheckedTreeExpand(value, type) {
  if (type == "menu") {
    let treeList = menuOptions.value;
    for (let i = 0; i < treeList.length; i++) {
      menuRef.value.store.nodesMap[treeList[i].id].expanded = value;
    }
  } else if (type == "dept") {
    let treeList = deptOptions.value; for (let i = 0; i < treeList.length; i++) {
      deptRef.value.store.nodesMap[treeList[i].id].expanded = value;
    }
  }
} /** 树权限（全选/全不选） */ function
  handleCheckedTreeNodeAll(value, type) {
  if (type == "menu") {
    menuRef.value.setCheckedNodes(value ? menuOptions.value :
      []);
  } else if (type == "dept") { deptRef.value.setCheckedNodes(value ? deptOptions.value : []); }
} /** 树权限（父子联动） */
function handleCheckedTreeConnect(value, type) {
  if (type == "menu") {
    form.value.menuCheckStrictly = value ? true :
      false;
  } else if (type == "dept") { form.value.deptCheckStrictly = value ? true : false; }
} /** 所有菜单节点数据 */ function
  getMenuAllCheckedKeys() { // 目前被选中的菜单节点 let checkedKeys=menuRef.value.getCheckedKeys(); // 半选中的菜单节点 let
  halfCheckedKeys = menuRef.value.getHalfCheckedKeys(); checkedKeys.unshift.apply(checkedKeys, halfCheckedKeys); return
  checkedKeys;
} /** 提交按钮 */ function submitForm() {
  proxy.$refs["roleRef"].validate(valid => {
    if (valid) {
      if (form.value.roleId != undefined) {
        form.value.menuIds = getMenuAllCheckedKeys();
        updateRole(form.value).then(response => {
          proxy.$modal.msgSuccess("修改成功");
          open.value = false;
          getList();
        });
      } else {
        form.value.menuIds = getMenuAllCheckedKeys();
        addRole(form.value).then(response => {
          proxy.$modal.msgSuccess("新增成功");
          open.value = false;
          getList();
        });
      }
    }
  });
}
/** 取消按钮 */
function cancel() {
  open.value = false;
  reset();
}
/** 选择角色权限范围触发 */
function dataScopeSelectChange(value) {
  if (value !== "2") {
    deptRef.value.setCheckedKeys([]);
  }
}
/** 分配数据权限操作 */
function handleDataScope(roleId) {
  proxy.$refs.dataScopeForm.init(roleId)
}
/** 提交按钮（数据权限） */
function submitDataScope() {
  if (form.value.roleId != undefined) {
    form.value.deptIds = getDeptAllCheckedKeys();
    dataScope(form.value).then(response => {
      proxy.$modal.msgSuccess("修改成功");
      openDataScope.value = false;
      getList();
    });
  }
}
/** 取消按钮（数据权限）*/
function cancelDataScope() {
  openDataScope.value = false;
  reset();
}

getList();
</script>
